A Swift Tour 閱讀筆記


Posted by Momo on 2020-12-07

A Swift Tour

Functions and Closures

  1. 可透過 tuple 的方式產生複合數值, 可用於 function 需要回傳多個數值時. Tuple 的每一個元素可以透過變數名稱或順序存取.

    func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
     var min = scores[0]
     var max = scores[0]
     var sum = 0
    
     for score in scores {
         if score > max {
             max = score
         } else if score < min {
             min = score
         }
         sum += score
     }
    
     return (min, max, sum)
    }
    let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
    print(statistics.sum)
    // Prints "120"
    print(statistics.2)
    // Prints "120"
    
  2. 可為 nested function. 當 function 過於複雜冗長, 可使用 nested function 編排程式碼.
    func returnFifteen() -> Int {
     var y = 10
     func add() {
         y += 5
     }
     add()
     return y
    }
    returnFifteen()
    
  3. Functions 也是類別的一種. 因此可以作為 Function 的 return value.
    func makeIncrementer() -> ((Int) -> Int) {
     func addOne(number: Int) -> Int {
         return 1 + number
     }
     return addOne
    }
    var increment = makeIncrementer()
    increment(7)
    
  4. Function 可以作為其他 Function 的參數
    func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
     for item in list {
         if condition(item) {
             return true
         }
     }
     return false
    }
    func lessThanTen(number: Int) -> Bool {
     return number < 10
    }
    var numbers = [20, 19, 7, 12]
    hasAnyMatches(list: numbers, condition: lessThanTen)
    

Objects and Classes

Initializer & Deinitializer

使用 init 創建 initializer.
呼叫 superclass's initalizer : super.init(...)
使用 deinit 創建 deinitializer, 用於 class object 被釋放前的資源清除.

Properties

class properties 可以有 getter 和 setter.
使用 willSet 和 didSet 處理 property 設置前和設置後的處置

Enumerations

存取 enumeration case 可使用 rawValue property

enum Rank: Int {
    case ace = 1
    case two, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king

    func simpleDescription() -> String {
        switch self {
        case .ace:
            return "ace"
        case .jack:
            return "jack"
        case .queen:
            return "queen"
        case .king:
            return "king"
        default:
            return String(self.rawValue)
        }
    }
}
let ace = Rank.ace
// Prints "ace"
let aceRawValue = ace.rawValue
// Prints "1"

也可使用 raw Value 作為 init?(rawValue:) 的參數初始化 enumeration. 當初始值無法 match enumeration 則為 nil.

if let convertedRank = Rank(rawValue: 13) {
    let threeDescription = convertedRank.description()
    print (threeDescription)
    // Prints "king"
}

關於列舉的原始值(raw value)跟相關值(associated value)在Swift 起步走-列舉有清楚的說明.

節錄文件關於原始值和相關值的說明:原始值(raw value)跟相關值(associated value)是不同的。原始值在定義列舉時即被設置,對於一個特定的列舉成員,它的原始值始終是相同的。而相關值是在列舉成員被指派為一個變數(或常數)時才一併設置的值,列舉成員的相關值是可以不同的。


##Swift #iOS







Related Posts

個人CodeBase紀錄 - EP.1 先來加入類別庫 真酷

個人CodeBase紀錄 - EP.1 先來加入類別庫 真酷

7. SpringBoot使用jms 聆聽連線錯誤處理(2)

7. SpringBoot使用jms 聆聽連線錯誤處理(2)

JavaScript If /else -如果我不會寫程式,你還會愛我嗎?

JavaScript If /else -如果我不會寫程式,你還會愛我嗎?


Comments